<?php
include_once "../../config/bd/conexion.php";

class GenerarDatosXMLGrid
   {
      private $pagina; // numero de pagina que se va a cargar
      private $limite; // total de registros por pagina
      private $id_row; // Id del renglon
      private $orden; // orden que se aplicara al grid
      private $inicio; // Numero de registro desde el cual se va a comenzar a obtener los datos
      private $total_registros; // Total de registros que devuelve la consulta
      private $total_paginas; // total de paginas que se van a generar
      private $sql_count; // Consulta para obtener el total de registros
      private $sql_query; // Consulta para obtener el detalle de los registros
      private $conexion; // Objeto que se utilizara para la conexion a la base de datos
      private $estructura_xml; // Almacena la estructura xml que se genera con la informacion de la base de datos
      private $agregar_columna_contador;
      private $num_columna_contador = 1;
      private $campos_booleans_cambiar; // Arreglo que almacena
      private $columnas_id; // Almacena las columnas que se utilizaran para generar el id

      public function __construct( )
         {
            $this -> conexion = new Conexion ( );
            $this -> conexion -> conectarDB ( );
         }

      public function setPagina( $pagina )
         {
            $this -> pagina = $pagina;
         }

      public function setLimite( $limite )
         {
            $this -> limite = $limite;
         }

      public function setIdRow( $id_row )
         {
            $this -> id_row = $id_row;
         }

      public function setOrden( $orden )
         {
            $this -> orden = $orden;
         }

      public function setSqlCount( $sql_count )
         {
            $this -> sql_count = $sql_count;
         }

      public function setSqlQuery( $sql_query )
         {
            $this -> sql_query = $sql_query;
         }

      public function getEstructuraXMl( )
         {
            return $this -> estructura_xml;
         }

      public function setAgregarColumnaContador( $columna_contador )
         {
            $this -> agregar_columna_contador = $columna_contador;
         }

      public function setNumeroColumnaContador( $numero_columna )
         {
            $this -> num_columna_contador = $numero_columna;
         }

      public function setAsignarColumnasId( $columnas_id )
        {
           $this -> columnas_id = $columnas_id;
        }   
         
      public function generarEstructuraXML( )
         {
            $this -> obtenerTotalRegistros ( );
            $this -> obtenerInformacionRegistros ( );
         }

      private function asignarLimiteQuery( )
         {
            if ( $this -> inicio && $this -> limite )
               {
                  $this -> sql_query .= " Limit " . $this -> inicio . ", " . $this -> limite;
               }
         }

         //
      private function obtenerInformacionRegistros( )
         {
            if ( $this -> sql_query )
               {
                  if ( $this -> conexion -> getConexion ( ) )
                     {
                        $this -> asignarLimiteQuery ( );
                        $query = mysql_query ( $this -> sql_query, $this -> conexion -> getConexion ( ) );
                        
                        //$describe = mysql_query("SHOW COLUMNS FROM $table");
                        if ( $query )
                           {
                              if ( mysql_num_rows ( $query ) > 0 )
                                 {
                                    $this -> estructura_xml = "<rows>";
                                    $this -> estructura_xml .= "<page>" . $this -> pagina . "</page>";
                                    $this -> estructura_xml .= "<total>" . $this -> total_paginas . "</total>";
                                    $this -> estructura_xml .= "<records>" . $this -> total_registros . "</records>";
                                    // Total de columas de la consulta
                                    $total_columnas = mysql_num_fields ( $query );
                                    
                                    if ( $this -> agregar_columna_contador )
                                       {
                                          if ( $this -> num_columna_contador > $total_columnas )
                                             {
                                                $this -> num_columna_contador = $total_columnas + 1;
                                             }
                                             
                                          if ( $this -> num_columna_contador <= 0 )
                                             {
                                                $this -> num_columna_contador = 1;
                                             }
                                       }
                                        // Recorremos los registros devueltos por la consutla			
                                    while ( $datos = mysql_fetch_array ( $query ) )
                                       {
                                          /* echo "<br />--------------------------------------------------------------------------------------------------------------";
										  echo "<br />";*/
                                          // Bandera que se utiliza solo cuando se va a generar el id
                                          $generar_id = true; // Bandera que se utiliza para verificar si el registro xml que se va a genera es el id
                                          $campo_id = false; // Bandera que se utiliza para verificar si el campo corresponde a un primary key										 
                                          $lista_primary_keys = array ();
                                          $existen_primary_keys = false;
                                          $valor = "";
                                          
                                          // Verificamos si se colocaron las columnas de las cuales se van a obtener los valores para
                                          // generar el id del renglon
                                          if ( $this -> columnas_id && $campo_id == false )
                                            {
                                               //echo "<br />Entro: [ $campo_id ]";
                                               for( $cont = 0; $cont < $total_columnas; $cont ++ )
                                                 {
                                                    // Obtenemos la informacion de la columna segun la posicion indicada en el parametro
                                                    $campo = mysql_fetch_field ( $query, $cont );
                                                    
                                                    if ( is_array( $this -> columnas_id ) && count( $this -> columnas_id ) > 0 )
                                                      {
                                                         $cont2 = 0;
                                                         
                                                         foreach ( $this -> columnas_id as $id )
                                                           {
                                                              $cont2++;
                                                              //echo "<br /> <b> $id -- " . $campo -> name . "</b><br/>";
                                                              if ( $id == $campo -> name )
                                                                {
                                                                   //echo "<br /> -----Entro-----";
                                                                   $valor .= $datos [$campo -> name];
                                                                   
                                                                   if ( $cont2 < count( $this -> columnas_id ) )
                                                                     {
                                                                        $valor .= "_";
                                                                     }
                                                                   
                                                                   $lista_primary_keys [] = $cont;
                                                                   $campo_id = true;
                                                                   $existen_primary_keys = true;
                                                                   
                                                                   break;
                                                                }
                                                           }
                                                      }
                                                      
                                                     /*  echo "<br />-------------";
                                                      var_dump( $valor );
                                                      echo "<br />--------------";
                                                       */
                                                    /*if ( $campo -> primary_key )
                                                       {
                                                          $valor .= $datos [$campo -> name] . "_";
                                                          $lista_primary_keys [] = $cont;
                                                          $campo_id = true;
                                                          $existen_primary_keys = true;
                                                       }*/                                                      
                                                 }
                                                 
                                               if ( $campo_id )
                                                 {
                                                     $this -> estructura_xml .= "<row id='" . $valor . "'>";
                                                 }  
                                            }
                                          else if ( $campo_id == false )
                                            {  
                                                //echo "<br />Entro 2";  
                                                // Solamente se obtienen los ids con el primer registro
                                                if ( count ( $lista_primary_keys ) <= 0 && $existen_primary_keys == false )
                                                   {
                                                      // Generamos el id que tendra cada renglon
                                                      for( $cont = 0; $cont < $total_columnas; $cont ++ )
                                                         {
                                                            // Obtenemos la informacion de la columna segun la posicion indicada en el parametro 
                                                            $campo = mysql_fetch_field ( $query, $cont );
                                                            
                                                            if ( $campo -> primary_key )
                                                               {
                                                                  $valor .= $datos [$campo -> name] . "_";
                                                                  $lista_primary_keys [] = $cont;
                                                                  $campo_id = true;
                                                                  $existen_primary_keys = true;
                                                               }
                                                         }
                                                   }
                                                   
                                                if ( $campo_id )
                                                   {
                                                      $this -> estructura_xml .= "<row id='" . $valor . "'>";
                                                   }
                                            }
                                          
                                          if ( $existen_primary_keys == false && !$this -> columnas_id )  
                                            {
                                               // Si no se especifica ningun valor para obtener el id, ni de columnas y tampoco
                                               // desde la tabla o si no aparece como primary key los campos entonces agrega el contador
                                               
                                               $this -> estructura_xml .= "<row id='" . ( $cont + 1 ) . "'>";
                                            }   
                                            
                                          if ( $this -> agregar_columna_contador )
                                             {
                                                if ( $this -> num_columna_contador == 1 )
                                                   {
                                                      $this -> estructura_xml .= "<cell>" . ( $cont + 1 ) . "</cell>";
                                                   }
                                             }
                                             
                                              // Recorremos todas las columnas devueltas por la consulta
                                          for( $cont = 0; $cont < $total_columnas; $cont ++ )
                                             {
                                                // Obtenemos la informacion de la columna segun la posicion indicada en el parametro 
                                                $campo = mysql_fetch_field ( $query, $cont );
                                                $obtener_valor = true; // Bandera que se utiliza para verificar si se obtiene o no el valor del campo
                                                // Hacemos una consulta para verificar el tipo del campo

                                                if ( $existen_primary_keys )
                                                   {
                                                      foreach ( $lista_primary_keys as $id )
                                                         {
                                                            if ( $id == $cont )
                                                               {
                                                                  $obtener_valor = false;
                                                                  break;
                                                               }
                                                         }
                                                   }
                                                   
                                                if ( $obtener_valor ) // Para el resto de campos
                                                   {
                                                      $this -> estructura_xml .= "<cell>" . $datos [$campo -> name] . "</cell>";
                                                   }
                                             }
                                             
                                          if ( $this -> agregar_columna_contador )
                                             {
                                                if ( $this -> num_columna_contador > $total_columnas )
                                                   {
                                                      $this -> estructura_xml .= "<cell>" . ( $cont + 1 ) . "</cell>";
                                                   }
                                             }
                                             
                                          $this -> estructura_xml .= "</row>";
                                       }
                                       
                                    $this -> estructura_xml .= "</rows>";
                                 }
                           }
                     }
               }
         }

         // Obtiene el total de registros que tiene la table/consulta que previamente se cargo en la clase  
      private function obtenerTotalRegistros( )
         {
            if ( $this -> sql_count )
               {
                  if ( $this -> conexion -> getConexion ( ) )
                     {
                        $query = mysql_query ( $this -> sql_count, $this -> conexion -> getConexion ( ) );
                        
                        if ( $query )
                           {
                              $datos = mysql_fetch_row ( $query );
                              
                              if ( mysql_num_rows ( $query ) > 0 )
                                 {
                                    $this -> total_registros = $datos [0];
                                    
                                    if ( $this -> total_registros > 0 && $this -> limite > 0 )
                                       {
                                          $this -> total_paginas = ceil ( $this -> total_registros / $this -> limite );
                                       }
                                    else
                                       {
                                          $this -> total_paginas = 0;
                                       }
                                       
                                    if ( $this -> pagina > $this -> total_paginas )
                                       {
                                          $this -> pagina = $this -> total_paginas;
                                       }
                                       
                                    $this -> inicio = $this -> limite * $this -> pagina - $this -> limite;
                                    
                                    if ( $this -> inicio < 0 )
                                       {
                                          $this -> inicio = 0;
                                       }
                                 }
                           }
                     }
               }
         }
   }
   
     
	/* $generar = new GenerarDatosXMLGrid();
	
	$pagina = 1;
	$limite = 10;
	$sidx = "direccion.id_direccion";
	$sord = "desc";
	// Enviamos los parametros necesarios a la clase que se encarga de generar la estructura XML
	$generar -> setPagina( $pagina );
	$generar -> setLimite( $limite );
	$generar -> setIdRow( $sidx );
	$generar -> setOrden( $sord );
	
	$sql = "SELECT distinct count( direccion.id_direccion ) as total
			FROM colonia
					INNER JOIN ciudad ON colonia.id_ciudad = ciudad.id_ciudad
					INNER JOIN direccion ON direccion.id_colonia = colonia.id_colonia";
					
	$generar -> setSqlCount( $sql );
	
	
	$sql = "SELECT direccion.id_direccion,
					direccion.calle,
					direccion.numero_interior,
					direccion.numero_exterior,
					direccion.codigo_postal,					
					colonia.nombre as Colonia,
					ciudad.nombre as Ciudad,
					direccion.principal
			from direccion 
					inner join colonia on direccion.id_colonia = colonia.id_colonia
					inner join ciudad on colonia.id_ciudad = ciudad.id_ciudad
	        order by $sidx $sord";
			
	$generar -> setSqlQuery( $sql );
	
	$generar -> setAgregarColumnaContador( true );
	
	$generar -> setNumeroColumnaContador( 1 );
	
	$generar -> setAsignarColumnasId( array( "id_direccion", "numero_interior", "numero_exterior" ) );
	echo "<br />";
	
	echo $sql;	
	//$generar -> setSqlQuery( $sql );
	
	// Generamos la estructura del xml 		
	$generar -> generarEstructuraXML();	  
	
	echo $generar -> getEstructuraXML(); */
